//
//  explicit.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/7.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef explicit_hpp
#define explicit_hpp

#include <stdio.h>
#include <iostream>

//explicit  显式关键字使该构造函数不适用于隐式转换
class MyString
{
private:
    std::string m_string;
public:
//    然而，这个构造函数仍然可以在类中使用（私有访问只能防止非成员调用此函数）。
//    解决此问题的更好方法是使用“delete”关键字（在C ++ 11中引入）来删除该函数：
    MyString(char) = delete; // any use of this constructor is an error
    
    // explicit keyword makes this constructor ineligible for implicit conversions
    //explicit 只能用于修饰构造函数
    explicit MyString(int x) // allocate string of size x
    {
        m_string.resize(x);
    }
    
    MyString(const char *string) // allocate string to hold string value
    {
        std::cout << "copy init" << std::endl;
        m_string = string;
    }
    
    MyString(const MyString &str):m_string(str.m_string){
        
    }
    
    friend std::ostream& operator<<(std::ostream& out, const MyString &s);
    
};

/*
 
 赋值运算符（运算符=）用于将值从一个对象复制到另一个已存在的对象。
 
 MyString mine = 'x'; // use copy initialization for MyString
 增加explicit后会报错，不支持隐式转换了
 
 //但是依然可以强制转换
 std::cout << static_cast<MyString>(5); (⊙﹏⊙)
 
 
 */


#endif /* explicit_hpp */
